﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SoftHotel.Models;
using System.Data.SqlClient;
using System.Web.Mvc;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Metadata.Edm;



namespace SoftHotel.Models
{
    public class ProductoDAO : DbContext                //CAMBIO PARA JALAR PRODUCTOS - NO MODIFICAR
    {
        public DbSet<Producto> prods { get; set; }              //CAMBIO PARA JALAR PRODUCTOS - NO MODIFICAR
        public List<ProductoModel> productos = new List<ProductoModel>() { };
        public List<ProductoModel> pbuscadis = new List<ProductoModel>() { };
        private Conexion conexionBD = new Conexion();

        public ProductoDAO(): base("conexionPrincipalDAO")  //CAMBIO PARA JALAR PRODUCTOS - NO MODIFICAR
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)            //CAMBIO PARA JALAR PRODUCTOS - NO MODIFICAR
        {
            modelBuilder.Entity<Producto>().ToTable("Producto");
        }


        public void insertar(){
            string consulta = "";
            //conexionBD.AbrirConexion();
            foreach (ProductoModel prod in productos)
            {
                int cat = buscarCategoria(prod.categoria);
                int est = buscarEstado(prod.estado);
                DateTime now1 = DateTime.Now;
                string now = String.Format("{0:d/M/yyyy HH:mm:ss}", now1);

                consulta = "insert into Producto  (descripcion, categoria, estado, fechaRegistro, fechaModificacion)" +
                "values (@descripcion, @cat, @est, @now, @now2 )";
                SqlCommand command = conexionBD.connection.CreateCommand();
                command.CommandText = consulta;
                command.Parameters.Add("@descripcion", SqlDbType.VarChar, 50).Value = prod.descripcion;
                command.Parameters.Add("@cat", SqlDbType.Int).Value = cat;
                command.Parameters.Add("@est", SqlDbType.Int).Value = est;
                command.Parameters.Add("@now", SqlDbType.DateTime).Value = now;
                command.Parameters.Add("@now2", SqlDbType.DateTime).Value = now;
                //"values ('" + prod.descripcion + "','" + cat + "','" + est + "','" + now + "','" + now + "')";
                conexionBD.EjecutarComando2(command);                
            }
            //conexionBD.CerrarConexion();
        }
        public void insertar2(ProductoModel prod)
        {
            string consulta = "";
            //conexionBD.AbrirConexion();
            
                int cat = buscarCategoria(prod.categoria);
                int est = buscarEstado(prod.estado);
                DateTime now1 = DateTime.Now;
                string now = String.Format("{0:d/M/yyyy HH:mm:ss}", now1);

                consulta = "insert into Producto  (descripcion, categoria, estado, fechaRegistro, fechaModificacion)" +
                "values (@descripcion, @cat, @est, @now, @now2 )";
                SqlCommand command = conexionBD.connection.CreateCommand();
                command.CommandText = consulta;
                command.Parameters.Add("@descripcion", SqlDbType.VarChar, 50).Value = prod.descripcion;
                command.Parameters.Add("@cat", SqlDbType.Int).Value = cat;
                command.Parameters.Add("@est", SqlDbType.Int).Value = est;
                command.Parameters.Add("@now", SqlDbType.DateTime).Value = now;
                command.Parameters.Add("@now2", SqlDbType.DateTime).Value = now;
                //"values ('" + prod.descripcion + "','" + cat + "','" + est + "','" + now + "','" + now + "')";
                conexionBD.EjecutarComando2(command);
            
            //conexionBD.CerrarConexion();
        }
        public int buscarCategoria(string categoria)
        {
            int x = 0;
            string query = "select * from Parametro where valor = '" + categoria + "'";
            SqlDataReader dr1 = conexionBD.EjecutarReader(query);
            if ( dr1 != null && dr1.Read()){
                x = Int32.Parse( dr1[0].ToString());
            }
            dr1.Close();
            return x;
        }
        public int buscarEstado(string estado){
             int x = 0;
             string query = "select * from Parametro where valor = '" + estado + "'";
            SqlDataReader dr2 = conexionBD.EjecutarReader(query);
            if ( dr2 != null && dr2.Read()){
                x = Int32.Parse( dr2[0].ToString());
            }
            dr2.Close();
            return x;
        }
        public SelectListItem[] obtenerTipos(string tipo)
        {
            //conexionBD.AbrirConexion();
            List<SelectListItem> ls = new List<SelectListItem>();
            string query= "select valor from Parametro where tipo = '"+tipo+"'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                ls.Add(new SelectListItem{Value = dr[0].ToString(), Text = dr[0].ToString()});
            }
            SelectListItem[] sls = new SelectListItem[ls.Count];
            for (int i = 0; i < ls.Count;i++){
                sls[i] = ls[i];
            }
            return sls;
        }

        public void eliminar()
        {
            for (int i = 0; i < productos.Count; i++)
            {
                if (productos.Count != 0 && productos[i].chequeado == true)
                {
                    productos.RemoveAt(i);
                    i--;
                }
            }
        }
        public string obtenerDatos(int x)
        {
            string datos = "";
            //conexionBD.AbrirConexion();//mare xurrevicky
            string query = "SELECT valor FROM Parametro WHERE idParametro =" + x ;
            SqlDataReader dr3 = conexionBD.EjecutarReader(query);
            if (dr3 != null && dr3.Read())
            {
                datos = dr3["valor"].ToString();
            }
            dr3.Close();            
            
            return datos;
        }
        public bool esta(string p)
        {
            foreach (var prod in productos)
            {
                if (p == prod.descripcion) return true;
            }
            return false;
        }

        public int buscar(string descripcion)
        {
            int i = 0;
            foreach (var prod in productos)
            {
                if (descripcion == prod.descripcion) return i;
                i++;
            }
            return -1;
        }

        public int buscar2(string descripcion)
        {
            int i = 0;
            foreach (var prod in pbuscadis)
            {
                if (descripcion == prod.descripcion) return i;
                i++;
            }
            return -1;
        }

        public void guardar(ProductoModel prod, string nombreOrignal)
        {
            int i = buscar(nombreOrignal);
            productos[i].descripcion = prod.descripcion;
            productos[i].categoria = prod.categoria;
            productos[i].estado = prod.estado;
            productos[i].fechaModificacion =  DateTime.Now;
        }
        public void guardar2(ProductoModel prod, string nombreOrignal)
        {
            int i = buscar2(nombreOrignal);
            pbuscadis[i].descripcion = prod.descripcion;
            pbuscadis[i].categoria = prod.categoria;
            pbuscadis[i].estado = prod.estado;
            pbuscadis[i].fechaModificacion = DateTime.Now;

            //conexionBD.AbrirConexion();
            string now = String.Format("{0:d/M/yyyy HH:mm:ss}", pbuscadis[i].fechaModificacion);
            int f,estado,categoria;
            string consulta2 = "SELECT idProducto FROM Producto WHERE descripcion ='" + nombreOrignal + "'";
            SqlDataReader dr4 = conexionBD.EjecutarReader(consulta2);
            dr4.Read();
            string s = dr4[0].ToString();
            f = Int32.Parse(s);
            dr4.Close();
            estado = buscarEstado(prod.estado);
            categoria = buscarCategoria(prod.categoria);
            string consulta = "UPDATE Producto SET descripcion = @desc, categoria = @cat, estado = @est, fechaModificacion = @now WHERE idProducto= @f";
            //'" +prod.descripcion + "', categoria ='" + categoria + "', estado ='" + estado + "', fechaModificacion ='" + now + "' WHERE idProducto= " + f;
            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta;
            command.Parameters.Add("@desc", SqlDbType.VarChar, 50).Value = prod.descripcion;
            command.Parameters.Add("@cat", SqlDbType.Int).Value = categoria;
            command.Parameters.Add("@est", SqlDbType.Int).Value = estado;
            command.Parameters.Add("@now", SqlDbType.DateTime).Value = now;
            command.Parameters.Add("@f", SqlDbType.Int).Value = f;
            conexionBD.EjecutarComando2(command);            
            //conexionBD.CerrarConexion();
        }
        public List<ProductoModel> buscar(ProductoModel producto)
        {
            string consulta = "";
            string datos = "";
            int x;            
            ProductoDAO consultor = new ProductoDAO();
            //conexionBD.AbrirConexion();
            consulta = "SELECT idProducto, descripcion, categoria, estado, fechaRegistro FROM Producto WHERE 1=1 ";
            if (producto.idProducto != null)
            {
                consulta += " and idProducto = " + Int32.Parse(producto.idProducto);
            }
            if (producto.descripcion != null)
            {
                consulta += " and descripcion LIKE '%" + producto.descripcion + "%'";
            }
            if (producto.categoria != null)
            {                
                x = consultor.buscarCategoria(producto.categoria);
                consulta += " and categoria = " + x;
            }
            if (producto.estado != null)
            {                
                x = consultor.buscarEstado(producto.estado);
                consulta += " and estado = " + x;
            }
            
            SqlDataReader dr = conexionBD.EjecutarReader(consulta);
            pbuscadis.Clear();
            while (dr != null && dr.Read())
            {
                ProductoModel busquedax = new ProductoModel();
                
                busquedax.descripcion = dr["descripcion"].ToString();
                datos = consultor.obtenerDatos(Int32.Parse(dr["categoria"].ToString()));
                busquedax.categoria = datos;
                datos = consultor.obtenerDatos(Int32.Parse(dr["estado"].ToString()));
                busquedax.estado = datos;
                busquedax.fechaRegistro = DateTime.Parse(dr["fechaRegistro"].ToString());
                busquedax.idProducto = dr["idProducto"].ToString();
                pbuscadis.Add(busquedax);
            }

            //conexionBD.CerrarConexion();

            return pbuscadis;
        }
        public List<ProductoModel> eliminar(ProductoModel producto)
        {
            string consulta = "";
            int datos;
            int f;
            int i = buscar2(producto.descripcion);
            datos = buscarEstado("Inactivo");
            pbuscadis[i].estado = "Inactivo";
            string consulta2 = "SELECT idProducto FROM Producto WHERE descripcion ='" + producto.descripcion + "'";
            SqlDataReader dr5 = conexionBD.EjecutarReader(consulta2);
            dr5.Read();
            string s = dr5[0].ToString();
            f = Int32.Parse(s);
            dr5.Close();            
            //conexionBD.AbrirConexion();
            consulta = "UPDATE Producto SET estado = @est WHERE idProducto= @f";
            //'" + datos + "' WHERE idProducto= " + f;
            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta;            
            command.Parameters.Add("@est", SqlDbType.Int).Value = datos;            
            command.Parameters.Add("@f", SqlDbType.Int).Value = f;
            conexionBD.EjecutarComando2(command);            
            
            //conexionBD.CerrarConexion();
            return pbuscadis;
        }
        public List<ProductoModel> eliminar2(ProductoModel producto)
        {
            

            
            int i = buscar(producto.descripcion);            
            productos.RemoveAt(i);
            

            //conexionBD.CerrarConexion();
            return productos;
        }

        public IEnumerable<ProductoModel> getProvinciasPorDepartamento(string prov)
        {
            List<ProductoModel> prodsXprov = new List<ProductoModel>();
            string query= "select idProveedor, razonSocial from Proveedor where razonSocial = '"+prov+"'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                prodsXprov.Add(new ProductoModel{idProducto = dr[0].ToString(), descripcion = dr[1].ToString()});
            }
            return prodsXprov;
        }
    }
}
